/***
 * 参考
 * https://www.bilibili.com/video/BV1QU4y1n7YD/?spm_id_from=333.788.top_right_bar_window_history.content.click&vd_source=57268e503ca639ff51cbfb538b2d40fc
 * 
 */

#include<linux/module.h>


static char * name = "罗俊华";
static int count = 6;
static int array[] = {1,2,3,4,5,6};
static int array_length = sizeof(array)/sizeof(int);

// 定义 int 类型参数
module_param(count,int,S_IRUGO);
// 定义char类型指针  （字符串）
module_param(name,charp,S_IRUGO);
// 定义数组参数
// 数组、数组元素类型、数组最大长度、权限
module_param_array(array,int,&array_length,S_IRUGO);

static int __init hello_init(void){
    printk("Hello Linux Module\n");

    for (int i = 0; i < count; i++)
    {
        printk(KERN_INFO "%d\n",array[i]);
    }
    
    printk(KERN_INFO "name:%s",name);

    return 0;
}

static void __exit hello_exit(void){
    printk(KERN_INFO "good bye linux kernel\n");
}

void invoke_hello_func(void);

void invoke_hello_func(void){

    printk(KERN_INFO "Hello 模块中的 invoke_hello_func 函数被执行了:%s\n",name);
}


module_init(hello_init);

module_exit(hello_exit);

/**  导出这个函数使得其他模块可以调用这个模块的方法
 * 不能导出static方法、变量，否则编译时报以下错误
 * ERROR: modpost: /home/luo/project/cpp_learning/linux_kernel/input_parameters/Hello: local symbol 'invoke_hello_func' was exported
*/
EXPORT_SYMBOL(invoke_hello_func);

// 导出变量
char* student_name = "喜羊羊";
EXPORT_SYMBOL(student_name);


//  许可证描述
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("luojunhua");
MODULE_VERSION("V1.0");